<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 使用typeof bar ===“object" 来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免

        //  尽管typeof bar === “object" 是检查bar是否是对象的可靠方法，但JavaScript中令人惊讶的问题nul也被认为是
        //一一个对像!

        // 因此，对于大多数开发人员来说，下面的代码会将true (而不是false)打印到控制台:

        // var bar= null;

        // cosole.logl(ypeof bar === "objec'); I1 logs true!

        // 只要知道这一点，就可以通过检查bar是否为空来轻松避免该问题:

        // console.Jog((bar !== null) && (typeof bar === "objecl); I1 logs false为了让我们的答案更加的完整，
        //还有两件事值得注意，首先， 如果bar是一一个函数，上面的解决方案将返回false.在大多数情况下，这是所期望的行为，
        //但是在您希望函数返回true的情况下，您可以将上述解决方案修改为:

        // console.lg((bar !== nul) && (typeof bar === "bjec')l (typeof bar==="unction');

        // 其次，如果bar是数组，则上述解决方案将返回true (例如，如果var bar : =0:)。在大多数情况下，这是所希望的行为，
        //因为数组确实是对象，但是在您想要对数组也是false的情况下，可以将上述解决方案修改为:

        // console,log((bar !== nul) && (typeof bar === "object") && (oString.call(bar) !== "object Aray)");

        // 但是，还有一一个替代方法对空值，数组和函数返回alse,但对于对象则为true;

        // cosole.log(lbar !== null) && (bar constructor ==== Objec));

        // 或者，如果您使用jQuery;

        // consolelog((bar = nul) && (typeof bar === "objec") && ! $isArray(bar));

        // ES5使得数组的情况非常简单，包括它自己的空检查:

        // console.logArrayisArray(bar);
    </script>
</body>

</html>